iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Software Development

Python 微進階系列 第 10

Python 微進階 Day10 - function(函式) - 1 - 參數

  • 分享至 

  • xImage
  •  

函式

  • function(函式)在 Python 是使用 def 來表示
  • 不一定要有參數、回傳值
    • 沒有設定 return,其實就是回傳 None
    • 當有多個 return,當執行到其中一個後就會結束這個函式,不會執行後續內容
  • 如果同名(例如內建函式),後來的會蓋過原本的,須注意
  • 函式內還可建立函式,稱為區域函式(Local function),將僅限在函式內使用
def functionname( 參數1, 參數2=預設值 ):
    程式碼區塊
    
    return value1, value2

小補充

  • 函式內一開始用 """ """ 包起來的註解描述可被 IDE 或 vscode 這類編輯器讀取,在使用函式時把滑鼠移到函式上,就可以動態看到註解描述的說明內容
  • 這段看來是被稱為 docstring 說明文件字串(Documentation Strings),所寫的內容會成為該物件的 __doc__ 屬性
def my_function():
    """Do nothing, but document it.

    No, really, it doesn't do anything.
    """
    pass

參數

  • 函式若有需求參數,則使用時須輸入,缺少或未帶入則會跳錯誤
    • 可變(mutable)物件從外部傳入時,可能會在函式內被影響,這時要用 copy() 等方式
  • 多個參數可不輸入參數名稱,會依照順序代入,或依照(指定)名稱代入
    • 可另外設定僅限位置引數,使用 /
    • 可另外設定僅限關鍵字引數,使用 *
    • 關鍵字引數(keyword argument)必須在位置引數(positional argument)後面
  • 參數可以有預設值,以 = 來處理,就屬於非必要參數,未輸入就會使用預設值
    • 沒有預設值的參數放在前面,有預設值的參數須放在後面 fun(位置參數, 預設值參數)
    • 如果有預設值(default argument),只有在建立 def 的時候會被運算一次,可用 __defaults__ 看到
    • 注意! 輸入或預設值若為可變(mutable)物件,如 list、set、dict,須謹慎處理,以免造成 bug,會這樣說是有時可能會想要利用這個狀況
    • 不可變(immutable)物件,如 int、string、tuple
def f(a, b):
    print("a", a)
    print("b", b)

f(5, 6)
# 依順序
# a 5
# b 6

f(b=5, a=6)
# 依參數名
# a 6
# b 5

參數

# 一般參數
def standard_arg(arg):
    print(arg)

# 僅限位置引數
def pos_only_arg(arg, /):
    print(arg)

# 僅限關鍵字引數
def kwd_only_arg(*, arg):
    print(arg)

# 混合使用
def combined_example(pos_only, /, standard, *, kwd_only):
    print(pos_only, standard, kwd_only)

可變物件

x = [1, 2]

def f(lst):
    lst = lst.copy()
    lst.append(3)
    print("lst", lst)

f(x)
print(x)

# lst [1, 2, 3]
# [1, 2]
# 外部 x 未被改動

def f(lst):
    lst.append(3)
    print("lst", lst)

f(x)
print(x)

# lst [1, 2, 3]
# [1, 2, 3]
# 外部 x 已被改動
def f(a, L=[]):
    L.append(a)
    return L

def b(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L


print(f.__defaults__)
print(b.__defaults__)
# f() 已經建立一個 []
# ([],)
# (None,)

print(f(1))
print(b(1))
# [1]
# [1]

print(f.__defaults__)
print(b.__defaults__)
# f() 還保留上一次建立的 [1]
# ([1],)
# (None,)
print(f(2))
print(b(2))
# f() 以上一次建立的 [1] 再 append 2
# [1, 2]
# [2]

小補充

def func(foo, bar=None, **kwargs):
    pass

func(42, bar=314, extra=somevar)

# foo、bar 和 kwargs 是 func 的參數
# 42、314 和 somevar 是引數

參考資料

次回

沒想到光參數就那麼多,還會繼續聊函式


上一篇
Python 微進階 Day09 - 流程控制 - 2 - for、range()、enumerate()、zip()
下一篇
Python 微進階 Day11 - function(函式) - 2 - *args、**kwargs、變數
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言